#ifndef DATASTRUCT_SORTTESTHELPER_H
#define DATASTRUCT_SORTTESTHELPER_H

#include <malloc.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "util.h"


/**
 * 随机生成n元素的数组 范围[rangeLeft,rangeRight]
 * @param n 元素的个数
 * @param rangeLeft    左边范围
 * @param rangeRight    右边范围
 * @return 指向数组的指针
 * 使用完成后需要释放 array指针 防止内存泄漏
 */
int* generateRandomArray(int n, int rangeLeft, int rangeRight){
    if(rangeLeft > rangeRight){
        swap(&rangeLeft,&rangeRight);
    }
    int i;
    int* array = (int*)malloc(sizeof(int) * n);
    srand(time(NULL));
    for (i = 0; i < n; ++i) {
        array[i] = rand() % (rangeRight - rangeLeft + 1) + rangeLeft;
    }
    return array;
}

/**
 * 生成几乎有序的数组
 * @param n  元素的个数
 * @param swapTimes 交换的次数
 * @return 指向数组的指针
 */
int* generateNearlyOrderRandomArray(int n, int swapTimes){
    int* array = (int*)malloc(sizeof(int) * n);
    int i,j;
    for (i = 0; i < n; ++i) {
        array[i] = i;
    }
    srand(time(NULL));
    for (j = 0; j < swapTimes; ++j) {
        int posX = rand() % n;
        int posY = rand() % n;
        swap(&array[posX], &array[posY]);
    }
    return  array;
}

/**
 * 测试排序算法的性能
 * @param string 排序函数名称
 * @param sort  函数指针
 * @param arr 测试数组
 * @param n 测试数组的长度
 */
void testSort(const char* string, void(*sort)(int array[],int length),int arr[], int n){
    clock_t startTime = clock();
    sort(arr, n);
    clock_t endTime = clock();
    printf("%s:%fs\n",string,(double)(endTime - startTime) / CLOCKS_PER_SEC);
}

#endif
